package com.project.server;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class Request {
    /** 客户端请求路径*/
    private String url;
    /**客户端请求的表单数据*/
    private Map<String,String> paramMap = new HashMap<>();
    public Request(InputStream is) {
        try {
            byte[] by = new byte[1024];
            //将读取流中的数据读取到byte数组
            is.read(by);
            //将字节流转换为字符串
            String str = new String(by).trim();
            System.out.println("客户端发送:"+str);
//            /** \\s+ 按照空格和回车拆分*/
//           this.url=str.split("\\s+")[1].substring(1);

            if (str.startsWith("GET")){
                this.getParam(str);
            }else
            if (str.startsWith("POST")){
                this.postParam(str);
            }

        }catch (Exception e){
            e.printStackTrace();
        }



    }

    /**
     * 处理GET请求
     * @param s 请求字符串
     */
    private void getParam(String s) {
        String[] array = s.split("\\s+");
        //需要提取第二个元素
        String urlStr = array[1].substring(1);
        if (urlStr.indexOf("?")==-1){//请求的是文件
            this.url = urlStr;
        }else {//请求的是业务组件
            String[] arr = urlStr.split("[?]");
            this.url=arr[0];
            this.fullMap(arr[1]);
        }

    }

    /**
     * 将形如a=1&b=2字符串封装成Map集合
     * @param s 表单数据
     */
    private void fullMap(String s) {
        String[] arr=s.split("&");
        for (String str:arr) {
            String[] tempArray=str.split("=");
            if (tempArray.length==2){
                this.paramMap.put(tempArray[0],tempArray[1]);
            }else if (tempArray.length==1){
                this.paramMap.put(tempArray[0],"");
            }
        }
    }

    /**
     * 处理POST请求
     * @param s 请求字符串
     */
    private void postParam(String s) {
        String[] array =s.split("\\s+");
        this.url=array[1].substring(1);
        this.fullMap(array[array.length-1]);
    }

    /**
     * 根据表单名，得到表单值
     * @param key 表单名
     * @return 表单值
     */
    public String getParameter(String key){
        return this.paramMap.get(key);
    }

    public String getUrl() {
        return url;
    }

    @Override
    public String toString() {
        return "Request{" +
                "url='" + url + '\'' +
                ", paramMap=" + paramMap +
                '}';
    }
}
